diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-21 17:24:17 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-21 17:27:10 +0300 |
| commit | 2eeea9a0cd8665bbe0e6c80f08603425498757e5 (patch) | |
| tree | 83f3f572fafbadd1d40593415ccb335d36373eb6 /website/src/pages/releases/[...slug].astro | |
| parent | 734bf3c09d292012b45b93a4813ccdd0cf26d08a (diff) | |
feat: add plugin marketplace
Diffstat (limited to 'website/src/pages/releases/[...slug].astro')
| -rw-r--r-- | website/src/pages/releases/[...slug].astro | 89 |
1 files changed, 0 insertions, 89 deletions
diff --git a/website/src/pages/releases/[...slug].astro b/website/src/pages/releases/[...slug].astro deleted file mode 100644 index 420d4b9e..00000000 --- a/website/src/pages/releases/[...slug].astro +++ /dev/null @@ -1,89 +0,0 @@ ---- -import { getCollection, render } from 'astro:content'; -import MarketingLayout from '../../components/MarketingLayout.astro'; - -export async function getStaticPaths() { - const releases = await getCollection('releases'); - return releases - .filter((release) => !release.data.draft) - .map((release) => { - const slug = release.data.path; - return { - params: { slug }, - props: { release, slug }, - }; - }); -} - -const { release, slug } = Astro.props; -const { Content, headings } = await render(release); -const sectionHeadings = headings.filter((heading) => heading.depth === 2); ---- - -<MarketingLayout - title={`${release.data.version}: ${release.data.title} — Herdr releases`} - description={release.data.description} - canonicalPath={`/releases/${slug}/`} - ogType="article" -> - <main class="content-shell"> - <div class="article-layout release-layout section"> - <aside class="article-toc" aria-label="Release sections"> - <p>Sections</p> - <nav> - {sectionHeadings.map((heading) => ( - <a href={`#${heading.slug}`} data-heading-link={heading.slug}>{heading.text}</a> - ))} - </nav> - </aside> - - <article class="article-shell release-shell"> - <header class="article-header release-header"> - <p class="post-meta"> - <a href="/releases/">Releases</a> - <span>{release.data.version}</span> - <time datetime={release.data.date.toISOString()}>{release.data.date.toLocaleDateString('en', { - year: 'numeric', - month: 'long', - day: 'numeric', - })}</time> - </p> - <h1>{release.data.title}</h1> - <p>{release.data.description}</p> - </header> - <div class="article-prose release-prose"> - <Content /> - </div> - </article> - </div> - </main> - - <script> - const headings = Array.from(document.querySelectorAll('.article-prose h2[id]')); - const links = new Map( - Array.from(document.querySelectorAll('[data-heading-link]')).map((link) => [ - link.getAttribute('data-heading-link'), - link, - ]), - ); - - function setActive(id) { - for (const link of links.values()) link.removeAttribute('aria-current'); - links.get(id)?.setAttribute('aria-current', 'true'); - } - - if (headings.length > 0 && links.size > 0) { - setActive(headings[0].id); - const observer = new IntersectionObserver( - (entries) => { - const visible = entries - .filter((entry) => entry.isIntersecting) - .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0]; - if (visible?.target instanceof HTMLElement) setActive(visible.target.id); - }, - { rootMargin: '-18% 0px -68% 0px', threshold: 0 }, - ); - for (const heading of headings) observer.observe(heading); - } - </script> -</MarketingLayout> |
